package com.petter.gradlespringboot.config;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author : GD
 * @date :2021/6/15 : 19:09
 *
 *
 *
 * execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern)
 *             throws-pattern?)
 *
 * execution(方法修饰符(可选)  返回类型  类路径 方法名  参数  异常模式(可选))
 *
 * 除了返回类型，方法名还有参数之外，其他都是可选的
 *
 * ret-type-pattern:可以为*表示任何返回值,全路径的类名等.
 *
 * name-pattern:指定方法名,*代表所以,set*,代表以set开头的所有方法.
 * parameters pattern:指定方法参数(声明的类型),         ()匹配没有参数；  (..)代表任意多个参数；   (*)代表一个参数，但可以是任意型；    (*,String)代表第一个参数为任何值,第二个为String类型。
 *
 * 下面给几个例子：
 *
 * 1）execution(public * *(..))——表示匹配所有public方法
 * 2）execution(* set*(..))——表示所有以“set”开头的方法
 * 3）execution(* com.xyz.service.AccountService.*(..))——表示匹配所有AccountService接口的方法
 * 4）execution(* com.xyz.service.*.*(..))——表示匹配service包下所有的方法
 * 5）execution(* com.xyz.service..*.*(..))——表示匹配service包和它的子包下的方法
 *
 *
 *
 */
@Aspect
@Component
public class AOPTest {

//    @Pointcut("execution(* *.index(..))")
//    @Pointcut("@annotation(org.springframework.web.bind.annotation.RestController)")
    @Pointcut("execution(* com.petter.gradlespringboot.controller.*.*(..))")
    public void test(){

    }

    @Before("test()")
    public void before(){

        System.out.println("log before");

    }

    @After("test()")
    public void after(){
        System.out.println("log after");
    }
}
